﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Infrastructure.Helper;
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Caching.Distributed;
using Infrastructure.Model.ApiResult;
using Infrastructure.Model.UserAuth;

namespace Infrastructure.Attribute
{
    /// <summary>
    /// 自定义特性类，用于在Action执行时进行权限验证。
    /// 通过该特性来检查当前用户是否具有访问特定操作的权限。
    /// </summary>
    public class PrivilegeAttribute : ActionFilterAttribute
    {
        /// <summary>
        /// 需要的权限名称。
        /// </summary>
        public string Permission { get; set; }

        /// <summary>
        /// 是否具有所需权限。
        /// </summary>
        private bool HasPermi { get; set; }

        /// <summary>
        /// 是否具有所需角色权限。
        /// </summary>
        private bool HasRole { get; set; }

        /// <summary>
        /// 默认构造函数。
        /// </summary>
        public     PrivilegeAttribute()
        {
        }

        /// <summary>
        /// 构造函数，接受权限名称作为参数。
        /// </summary>
        /// <param name="permission">所需权限名称</param>
        public PrivilegeAttribute(string permission)
        {
            Permission = permission;
            HasPermi = !string.IsNullOrEmpty(Permission);
        }

     
        /// <summary>
        /// 不带缓存
        /// 重写OnActionExecutionAsync方法，在执行Action之前进行权限检查。
        /// 如果用户未登录或没有权限访问，返回相应的错误信息。
        /// </summary>
        /// <param name="context">当前Action执行上下文</param>
        /// <param name="next">下一个Action执行委托</param>
        /// <returns>返回一个任务，表示权限验证是否通过。</returns>
        public override Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
        {
           
       
            // 获取当前登录用户
            LoginUser loginUser = JwtUtil.GetLoginUser(context.HttpContext);

            // 判断用户是否已登录且UserId不为空
            if (loginUser != null && loginUser?.UserId != "")
            {
                // 获取用户的权限列表
                List<string> permissions = loginUser.Permissions;

                // 判断用户是否为管理员权限
                if (permissions != null && permissions.Exists((string f) => f.Equals(GlobalConstant.AdminPerm)))
                {
                    HasPermi = true;
                }
                else if (!string.IsNullOrEmpty(Permission))
                {
                    // 判断用户是否拥有指定权限
                    HasPermi = permissions?.Exists((string f) => f.ToLower() == Permission.ToLower()) ?? false;
                }

                // 如果没有权限且不是"system"权限，则返回没有权限的错误提示
                if (!HasPermi && !Permission.Equals("system"))
                {
                    context.Result = new JsonResult(new
                    {
                        Code = ResultCode.FORBIDDEN,
                        Msg = "你没有权限访问"
                    });
                }
            }
            else if (loginUser == null)
            {
                // 如果未登录，则返回未登录的错误提示
                context.Result = new JsonResult(new
                {
                    Code = ResultCode.FORBIDDEN,
                    Msg = "未登录"
                });
            }

            // 执行下一个Action
            return base.OnActionExecutionAsync(context, next);
        }
        ///// <summary>
        ///// 带缓存使用微服务
        ///// 重写OnActionExecutionAsync方法，在执行Action之前进行权限检查。
        ///// 如果用户未登录或没有权限访问，返回相应的错误信息。
        ///// 
        ///// </summary>
        ///// <param name="context">当前Action执行上下文</param>
        ///// <param name="next">下一个Action执行委托</param>
        ///// <returns>返回一个任务，表示权限验证是否通过。</returns>
        //public override Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
        //{
        //    // 从服务容器中获取分布式缓存服务
        //    var cacheService = App.ServiceProvider.GetService(typeof(IDistributedCache)) as IDistributedCache;
        //    if (cacheService == null)
        //    {
        //        throw new InvalidOperationException("缺少分布式缓存服务");
        //    }
        //    IDistributedCache distributedCache = cacheService;

        //    // 获取当前登录用户
        //    LoginUser loginUser = JwtUtil.GetLoginUser(context.HttpContext, distributedCache);

        //    // 判断用户是否已登录且UserId不为空
        //    if (loginUser != null && loginUser?.UserId != "")
        //    {
        //        // 获取用户的权限列表
        //        List<string> permissions = loginUser.Permissions;

        //        // 判断用户是否为管理员权限
        //        if (permissions != null && permissions.Exists((string f) => f.Equals(GlobalConstant.AdminPerm)))
        //        {
        //            HasPermi = true;
        //        }
        //        else if (!string.IsNullOrEmpty(Permission))
        //        {
        //            // 判断用户是否拥有指定权限
        //            HasPermi = permissions?.Exists((string f) => f.ToLower() == Permission.ToLower()) ?? false;
        //        }

        //        // 如果没有权限且不是"system"权限，则返回没有权限的错误提示
        //        if (!HasPermi && !Permission.Equals("system"))
        //        {
        //            context.Result = new JsonResult(new
        //            {
        //                Code = ResultCode.FORBIDDEN,
        //                Msg = "你没有权限访问"
        //            });
        //        }
        //    }
        //    else if (loginUser == null)
        //    {
        //        // 如果未登录，则返回未登录的错误提示
        //        context.Result = new JsonResult(new
        //        {
        //            Code = ResultCode.FORBIDDEN,
        //            Msg = "未登录"
        //        });
        //    }

        //    // 执行下一个Action
        //    return base.OnActionExecutionAsync(context, next);
        //}
    }
}
